x86: Fix paging_init() to not overwrite existing page-directory entry
authorKeir Fraser <keir@xensource.com>
Fri, 24 Aug 2007 15:19:14 +0000 (16:19 +0100)
committerKeir Fraser <keir@xensource.com>
Fri, 24 Aug 2007 15:19:14 +0000 (16:19 +0100)
for fixmap area.
Signed-off-by: Keir Fraser <keir@xensource.com>
xen/arch/x86/x86_32/mm.c
xen/arch/x86/x86_64/mm.c

index eab7e1be724d042afcd747a95089f8a201acfcae..9b3780f0c9eebf67063537244304f903310ce575 100644 (file)
@@ -68,7 +68,6 @@ l2_pgentry_t *virt_to_xen_l2e(unsigned long v)
 
 void __init paging_init(void)
 {
-    void *ioremap_pt;
     unsigned long v;
     struct page_info *pg;
     int i;
@@ -115,13 +114,17 @@ void __init paging_init(void)
     for ( i = 0; i < (mpt_size / BYTES_PER_LONG); i++)
         set_gpfn_from_mfn(i, 0x55555555);
 
-    /* Create page tables for ioremap(). */
+    /* Create page tables for ioremap()/map_domain_page_global(). */
     for ( i = 0; i < (IOREMAP_MBYTES >> (L2_PAGETABLE_SHIFT - 20)); i++ )
     {
-        ioremap_pt = alloc_xenheap_page();
-        clear_page(ioremap_pt);
-        l2e_write(&idle_pg_table_l2[l2_linear_offset(IOREMAP_VIRT_START) + i],
-                  l2e_from_page(virt_to_page(ioremap_pt), __PAGE_HYPERVISOR));
+        void *p;
+        l2_pgentry_t *pl2e;
+        pl2e = &idle_pg_table_l2[l2_linear_offset(IOREMAP_VIRT_START) + i];
+        if ( l2e_get_flags(*pl2e) & _PAGE_PRESENT )
+            continue;
+        p = alloc_xenheap_page();
+        clear_page(p);
+        l2e_write(pl2e, l2e_from_page(virt_to_page(p), __PAGE_HYPERVISOR));
     }
 }
 
index 600d1a70343960d3ebaf52a71a4890913b1d31cb..596bf5cecdb77c77905b7d637dd77bc2e4aba292 100644 (file)
@@ -100,15 +100,15 @@ void __init paging_init(void)
     unsigned long i, mpt_size, va;
     l3_pgentry_t *l3_ro_mpt;
     l2_pgentry_t *l2_ro_mpt = NULL;
-    struct page_info *l1_pg, *l2_pg;
+    struct page_info *l1_pg, *l2_pg, *l3_pg;
 
     /* Create user-accessible L2 directory to map the MPT for guests. */
-    if ( (l2_pg = alloc_domheap_page(NULL)) == NULL )
+    if ( (l3_pg = alloc_domheap_page(NULL)) == NULL )
         goto nomem;
-    l3_ro_mpt = page_to_virt(l2_pg);
+    l3_ro_mpt = page_to_virt(l3_pg);
     clear_page(l3_ro_mpt);
     l4e_write(&idle_pg_table[l4_table_offset(RO_MPT_VIRT_START)],
-              l4e_from_page(l2_pg, __PAGE_HYPERVISOR | _PAGE_USER));
+              l4e_from_page(l3_pg, __PAGE_HYPERVISOR | _PAGE_USER));
 
     /*
      * Allocate and map the machine-to-phys table.